#include "memory.h"
#include "i2c.h"
#include "J_EEROM.h"
#include "CRC16.h"
#include "malloc.h"
#include "ZY_Flash.h"
J_EEROM_Def_t      eerom_handle;
extern Mallco_dev mallco_dev; //内存管理器

#define EEROM_ARRR     0xA0    //EEROM I2C地址
/**************************************
 * 功能：I2C 写函数
 * 参数：
 *         dev_addr:i2c器件地址
 *         MemAddress:内存地址
 *         MemAddsize：内存地址长度
**************************************/
void EEROM_I2C_Read(uint16_t dev_addr,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *data,uint16_t size,uint32_t Timeout)
{
    if(HAL_I2C_Mem_Read(&hi2c1,dev_addr,MemAddress,MemAddSize,data,size,Timeout)!=HAL_OK)    //I2C读数据
		{
		}
}
/******************************************
 * 功能：I2C写函数
 * 参数：
 *         dev_addr：i2c器件地址
 *         MemAddress：内存地址
 *         MemAddSize：内存地址长度
 *         data：数据指针
 *         size：数据长度
 *****************************************/
void EEROM_I2C_Write(uint16_t dev_addr,uint16_t MemAddress,uint16_t MemAddSize,uint8_t *data,uint16_t size,uint32_t Timeout)
{
    HAL_I2C_Mem_Write(&hi2c1,dev_addr,MemAddress,MemAddSize,data,size,Timeout);    //I2C写数据
}
void AT24CXX_Write(J_EEROM_Def_t *handle,uint16_t WriteAddr,uint8_t *pBuffer,uint16_t len);
/***********************
 * 功能：存储初始化
 * 参数：无
 * 返回：无
***********************/
void Memory_Init(void)
{
	//HAL_GPIO_WritePin(EE_WP_GPIO_Port,EE_WP_Pin,GPIO_PIN_SET);
	//J_EEROM_Init(&eerom_handle,EEROM_ARRR,AT24C02,EEROM_I2C_Write,EEROM_I2C_Read);
}
/*********************
 * 功能：读取指定文件位置的数据
 * 参数：
 *         data:数据
 *         size：数据长度
 * 返回：
 *         读取状态 1：成功 0：失败
*********************/
uint8_t Memory_ReadData(uint8_t *data,uint8_t size,uint32_t file_add)
{
	uint16_t crc=0;
	uint8_t *buf;
	uint8_t status=0;
	buf = (uint8_t *)mymalloc(&mallco_dev, size+2);
	if(buf)
	{
		//AT24CXX_Read(&eerom_handle,(uint16_t)file_add,buf,size+2);     //从EEROM读取数据
		user_flash_read((uint16_t)file_add,buf,size+2);
		crc=buf[size+1];
	  crc=(crc<<8)+buf[size];
	  if(crc== CRC_16(buf,size))
	  {
		  mymemcpy(data,buf,size);
		  status=1;
	  }
	  myfree(&mallco_dev, buf);
  }
	return status;
}

uint8_t Memory_Clear(void)
{
	return user_flash_erase();
}
/**********************
 * 功能：将文件写入指定位置
 * 参数：
 *         data：数据
 *         size：数据长度
 *         file_add: 文件位置
 * 返回：无
**********************/
uint8_t Memory_WriteData(uint8_t *data,uint8_t size,uint32_t file_add) 
{
	uint16_t crc=0;
	uint8_t *buf;
	HAL_GPIO_WritePin(EE_WP_GPIO_Port,EE_WP_Pin,GPIO_PIN_RESET);
	if(buf)
	{
		buf = (uint8_t *)mymalloc(&mallco_dev, size+2);
	  crc=CRC_16(data,size);
	  mymemcpy(buf,data,size);
	  buf[size]=(uint8_t)crc;
	  buf[size+1]=(uint8_t)(crc>>8);
		
	  //AT24CXX_Write(&eerom_handle,file_add,buf,size+2);    //向EEROM写入数据
		user_flash_write(file_add,buf,size+2);
	  myfree(&mallco_dev, buf);
	}
	HAL_GPIO_WritePin(EE_WP_GPIO_Port,EE_WP_Pin,GPIO_PIN_SET);
}


